<?php
// 应用公共文件
use think\facade\Request;
use think\facade\Db;
use think\facade\Image;

require_once __DIR__ . '/../vendor/autoload.php';

if (!function_exists('getRandStr')) {
    /**
     * @param int $len 长度
     * @param bool $special 是否加入特殊字符
     * @return string  字符串
     */
    function getRandStr($len = 30, $special = false)
    {
        $chars = array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
            "3", "4", "5", "6", "7", "8", "9"
        );
        if ($special) {
            $chars = array_merge($chars, array(
                "!", "@", "#", "$", "?", "|", "{", "/", ":", ";",
                "%", "^", "&", "*", "(", ")", "-", "_", "[", "]",
                "}", "<", ">", "~", "+", "=", ",", "."
            ));
        }
        $charsLen = count($chars) - 1;
        shuffle($chars);                            //打乱数组顺序
        $str = '';
        for ($i = 0; $i < $len; $i++) {
            $str .= $chars[mt_rand(0, $charsLen)];    //随机取出一位
        }
        return $str;
    }
}

if (!function_exists('setConfig')) {
    /**
     * 设置系统配置
     * @param string $type 配置关键词
     * @param array $data 需要保存的数组
     * @return void
     */
    function setConfig($type, $data)
    {
        $data = empty($data) ? null : $data;
        $content = DB::name('config')->where(['key' => $type])->find();
        $json_str = json_encode($data, JSON_UNESCAPED_UNICODE);
        if (!empty($content)) {
            if ($data) {
                $res = DB::name('config')->where(['key' => $type])->update(['value' => $json_str]);
            } else {
                $res = DB::name('config')->where(['key' => $type])->delete();
            }
        } else {
            $res = DB::name('config')->insert(array('value' => $json_str, 'key' => $type));
        }
        return $res;
    }
}
if (!function_exists('getConfig')) {
    /**
     * 获取系统配置
     * @param string $type 配置关键词
     * @return void
     */
    function getConfig($type)
    {
        $content = Db::name('config')->where(['key' => $type])->value('value');
        $config = json_decode($content, true);
        return $config;
    }
}

if (!function_exists('imageUrl')) {
    /**
     * 图片补全路径
     * @param string $type 配置关键词
     * @return void
     */
    function imageUrl($url = '')
    {
        if ($url == '') {
            return '';
        }
        //        $pre = request()->domain();
        $pre = 'https://ouhechaowan.oss-cn-beijing.aliyuncs.com';
        if (strpos($url, 'http') !== false) {
            $path = $url;
        } else if (strpos($pre, '192.168') !== false) { #测试环境
            $path = $pre . "ceshi/public/" . $url;
        } else if ($url === '0') {
            $path = $pre;
        } else {
            $path = $pre . $url;
        }
        $path = str_replace('\\', '/', $path);
        return $path;
    }
}

if (!function_exists('contentUrl')) {
    /**
     * 补充富文本内容图片路径
     * @param content 富文本内容
     * @return 返回处理后的富文本内容
     */
    function contentUrl($content)
    {
        $url = request()->domain() . '/';
        if (strpos($url, '192.168') !== false) { #测试环境
            $url = $url . "ceshi/public/";
        }
        $pregRule = "/<[img|IMG].*?src=[\‘|\"](.*?(?:[\.jpg|\.jpeg|\.png|\.gif|\.bmp]))[\‘|\"].*?[\/]?>/";
        $content = preg_replace($pregRule, '<img src="' . $url . '${1}" style="max-width:100%">', htmlspecialchars_decode($content));
        return $content;
    }
}

if (!function_exists('shuffle_assoc')) {
    /**
     * 二维数组打乱顺序
     * @param string $list 列表数组
     * @return void
     */
    function shuffle_assoc($list)
    {
        if (!is_array($list)) {
            return $list;
        }
        $keys = array_keys($list);
        shuffle($keys);
        $random = array();
        foreach ($keys as $k => $key) {
            $random[$k] = $list[$key];
        }
        return $random;
    }
}

if (!function_exists('arraySequence')) {
    /**
     * 二位数组指定字段排序
     * @param $array
     * @param $field
     * @param string $sort
     * @return array
     */
    function arraySequence($array, $field, $sort = 'SORT_DESC')
    {
        $else_data = [];
        $arrSort = array();
        $new_arrSort = array();
        $len = 0;
        foreach ($array as $uniqid => $row) {
            $new_arrSort[] = $row;
            foreach ($row as $key => $value) {
                $arrSort[$key][$len] = $value;
            }
            $len++;
        }
        array_multisort($arrSort[$field], constant($sort), $new_arrSort);
        $new_array = array_merge($else_data, $new_arrSort);
        return $new_array;
    }
}

if (!function_exists('create_order_no')) {
    /**
     * 生成订单号
     * @return string
     */
    function create_order_no($pre = 'NO_', $tale = 'order', $field = 'order_num')
    {
        $order_no = $pre . date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8) . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
        $r = Db::name($tale)->field('id')->where([$field => $order_no])->find();
        if ($r) {
            $order_no = create_order_no($pre);
        }
        return $order_no;
    }
}
if (!function_exists('getPrizeCode')) {

    /**
     * 获取盒子奖品编号
     * @param int $len 推荐码长度
     */
    function getPrizeCode($len = 10, $special = false)
    {
        $chars = array(
            "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
            "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
            "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
            "3", "4", "5", "6", "7", "8", "9"
        );
        $charsLen = count($chars) - 1;
        shuffle($chars);                            //打乱数组顺序
        $str = '';
        for ($i = 0; $i < $len; $i++) {
            $str .= $chars[mt_rand(0, $charsLen)];    //随机取出一位
        }
        $i = Db::name('goods_list')->where(['prize_code' => $str])->find();
        if ($i) {
            $str = getPrizeCode();
        }
        return $str;
    }
}

if (!function_exists('curlGet')) {
    /**
     * curl请求指定url (get)
     * @param $url
     * @param array $data
     * @return mixed
     */
    function curlGet($url)
    {
        $headerArray = array("Content-type:application/json;", "Accept:application/json");
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray);
        $output = curl_exec($ch);
        curl_close($ch);
        $output = json_decode($output, true);
        return $output;
    }
}

if (!function_exists('curlPost')) {
    /**
     * curl请求指定url (post)
     * @param $url
     * @param array $data
     * @return mixed
     */
    function curlPost($url, $data = [])
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }
}

if (!function_exists('admin_md5')) {

    /**
     * @param $msg 需要加密的参数
     * @return bool
     */
    function admin_md5($msg)
    {
        return sha1(md5(md5('admin_md5_password' . $msg)));
    }
}

if (!function_exists('user_md5')) {
    /**
     * @param $msg 需要加密的参数
     * @return bool
     */
    function user_md5($msg)
    {
        return sha1('md5' . md5(md5('user_md5' . $msg)));
    }
}

if (!function_exists('RegMoney')) {
    /**
     * @param $money 需要验证的金额
     * @return bool
     */
    function RegMoney($money = -1)
    {
        $preg_money = '/^(0|[1-9]\d{0,10})(\.\d{1,2})?$/';
        if (!preg_match($preg_money, $money)) {
            return true;
        }
        return false;
    }
}

if (!function_exists('RegInt')) {
    /**
     * @param $num 需要验证的整数
     * @return bool
     */
    function RegInt($num = -1)
    {
        $preg_int = '/^[1-9]\d{0,10}$/';
        if (!preg_match($preg_int, $num)) {
            return true;
        }
        return false;
    }
}
if (!function_exists('RegZero')) {

    /**
     * @param $num 需要验证的整数
     * @return bool
     */
    function RegZero($num = -1)
    {
        $preg_int = '/^[0-9]\d{0,10}$/';
        if (!preg_match($preg_int, $num)) {
            return true;
        }
        return false;
    }
}
if (!function_exists('expressWuliu')) {

    /**
     * 查物流
     * @param $no 订单号
     * @param $type 快递公司编号
     * @return array
     */
    function expressWuliu($no = '', $type = '')
    {
        $host = "https://wuliu.market.alicloudapi.com"; //api访问链接
        $path = "/kdi"; //API访问后缀
        $method = "GET";
        $appcode = getConfig('base')['logistics_code']; //开通服务后 买家中心-查看AppCode
        $headers = array();
        array_push($headers, "Authorization:APPCODE " . $appcode);
        $querys = "no=" . $no . "&type=" . $type; //参数写在这里
        $bodys = "";
        $url = $host . $path . "?" . $querys;
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_FAILONERROR, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HEADER, true);
        if (1 == strpos("$" . $host, "https://")) {
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        }
        $out_put = curl_exec($curl);
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        list($header, $body) = explode("\r\n\r\n", $out_put, 2);
        if ($httpCode == 200) {
            //            print("正常请求计费(其他均不计费)<br>");
            //            print($body);
            $body = json_decode($body, true);
            if ($body['status'] == 0 && $body['msg'] == 'ok') {
                return ['code' => 1, 'msg' => $body['result']];
            } else {
                return ['code' => 0, 'msg' => $body['msg']];
            }
        } else {
            if ($httpCode == 400 && strpos($header, "Invalid Param Location") !== false) {
                //                print("参数错误");
                return ['code' => 0, 'msg' => '参数错误'];
            } elseif ($httpCode == 400 && strpos($header, "Invalid AppCode") !== false) {
                //                print("AppCode错误");
                return ['code' => 0, 'msg' => 'AppCode错误'];
            } elseif ($httpCode == 400 && strpos($header, "Invalid Url") !== false) {
                //                print("请求的 Method、Path 或者环境错误");
                return ['code' => 0, 'msg' => '请求的 Method、Path 或者环境错误'];
            } elseif ($httpCode == 403 && strpos($header, "Unauthorized") !== false) {
                //                print("服务未被授权（或URL和Path不正确）");
                return ['code' => 0, 'msg' => '服务未被授权（或URL和Path不正确）'];
            } elseif ($httpCode == 403 && strpos($header, "Quota Exhausted") !== false) {
                //                print("套餐包次数用完");
                return ['code' => 0, 'msg' => '套餐包次数用完'];
            } elseif ($httpCode == 500) {
                //                print("API网关错误");
                return ['code' => 0, 'msg' => 'API网关错误'];
            } elseif ($httpCode == 0) {
                //                print("URL错误");
                return ['code' => 0, 'msg' => 'URL错误'];
            } else {
                //                print("参数名错误 或 其他错误");
                //                print($httpCode);
                return ['code' => 0, 'msg' => '参数名错误 或 其他错误'];
                $headers = explode("\r\n", $header);
                $headList = array();
                foreach ($headers as $head) {
                    $value = explode(':', $head);
                    $headList[$value[0]] = $value[1];
                }
                print($headList['x-ca-error-message']);
            }
        }
    }
}

if (!function_exists('resCheck')) {
    /**
     * @param $rs 数据库结果集的判断
     * @return bool
     */
    function resCheck($data)
    {
        foreach ($data as $value) {
            if (is_array($value)) {
                foreach ($value as $val) {
                    if (is_array($val)) {
                        foreach ($val as $va) {
                            if (is_array($va)) {
                                foreach ($va as $v) {
                                    if (!$v) {
                                        return false;
                                    }
                                }
                            } else {
                                if (!$va) {
                                    return false;
                                }
                            }
                        }
                    } else {
                        if (!$val) {
                            return false;
                        }
                    }
                }
            } else {
                if (!$value) {
                    return false;
                }
            }
        }
        return true;
    }
}

function p($msg = '', $type = 0)
{
    echo '<pre>';
    if ($type == 0) {
        print_r($msg);
    } else {
        var_dump($msg);
    }
    die;
}

if (!function_exists('thumbImage')) {
    /**
     * 缩放图片
     * @param $url 图片路径
     * @return int
     */
    function thumbImage($path = '', $width = 0, $height = 0, $radius = 0, $bg = 0)
    {
        require_once('../vendor/topthink/think-image/src/Image.php'); // Ensure this is correct
        $image = \think\Image::open($path);
        // 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.png
        $image->thumb($width, $height)->radius($radius, $bg)->save($path);
        return true;
    }
}

if (!function_exists('time_jian')) {
    /**
     * 缩放图片
     * @param $url 图片路径
     * @return int
     */
    function time_jian($star_time, $end_time)
    {
        // 计算两个时间戳之间的差值（单位：秒）
        $timeDiff = $end_time - $star_time;

        // 根据差值计算经过了多少秒、分钟、小时和天
        $seconds = $timeDiff % 60;
        $minutes = floor(($timeDiff / 60) % 60);
        $hours = floor(($timeDiff / (60 * 60)) % 24);
        $days = floor($timeDiff / (60 * 60 * 24));
        $str = '';
        if ($days) {
            $str .= "{$days}天";
        }
        if ($hours) {
            $str .= "{$hours}小时";
        }
        if ($minutes) {
            $str .= "{$minutes}分钟";
        }
        if ($seconds) {
            $str .= "{$seconds}秒";
        }
        return $str;
    }
}

// 订单支付日志
function writelog($filename, $content)
{
    $date = date('Y-m-d');
    $file = "./pay_log/" . $date;
    if (!is_dir($file)) {
        mkdir(iconv("UTF-8", "GBK", $file), 0777, true);
    }
    $file = $file . "/" . $filename . ".txt";
    $content = "【收到信息" . date("Y-m-d H:i:s", time()) . "】\n" . var_export($content,true) . "\r\n\r\n";
    $open = fopen($file, "a");
    fwrite($open, $content);
    fclose($open);
}
function saveLog($data)
{
    $years = date('Y-m');
    //设置路径目录信息
    $url = __DIR__ . '/logs/' . $years . '/' . date('Ymd') . '.txt';
    $dir_name = dirname($url);
    //目录不存在就创建
    if (!file_exists($dir_name)) {
        //iconv防止中文名乱码
        $res = mkdir(iconv("UTF-8", "GBK", $dir_name), 0777, true);
    }
    $fp = fopen($url, "a"); //打开文件资源通道 不存在则自动创建
    fwrite($fp, date("Y-m-d H:i:s") . "\n" . var_export($data, true) . "\r\n"); //写入文件
    fclose($fp); //关闭资源通道
}

//广告
function tencent_ad_attribution($click_id, $money, $account_id, $access_token, $user_action_set_id)
{
    //    $access_token = '80a2138abe0227598ea9ae8a2a55ba69';
    //    $user_action_set_id = 1200995945;
    $interface = 'user_actions/add';
    $url = 'https://api.e.qq.com/v1.1/' . $interface;

    $common_parameters = array(
        'access_token' => $access_token,
        'timestamp' => time(),
        'nonce' => md5(uniqid('', true))
    );

    $parameters = array(
        'account_id' => $account_id,
        'user_action_set_id' => $user_action_set_id,
        'actions' =>
        array(
            0 =>
            array(
                'url' => 'ruiou.ruiouyifanshang.com',
                'external_action_id' => strtolower(md5(rand(100000, 999999))) . '_complete_order_1492991000_30569088_1200995945',
                'action_time' => time(),
                'action_type' => 'COMPLETE_ORDER',
                //                        'custom_action' => 'my_type',
                'trace' => [
                    'click_id' => $click_id,
                ],
                'action_param' =>
                [
                    'value' => $money
                ]
            ),
        ),
    );
    // dd($parameters);
    // dump($common_parameters);

    $parameters = json_encode($parameters);
    $request_url = $url . '?' . http_build_query($common_parameters);
    // var_dump($parameters);
    // dd($request_url);

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $request_url);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 60);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $parameters);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
        "Content-Type:application/json"
    ));
    $response = curl_exec($curl);
    if (curl_error($curl)) {
        $error_msg = curl_error($curl);
        $error_no = curl_errno($curl);
        curl_close($curl);
        throw new \Exception($error_msg, $error_no);
    }
    curl_close($curl);
    \think\facade\Log::write($response, 'warning');
    return $response;
}


function getData($url, $header)
{

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);

    $handles = curl_exec($ch);

    curl_close($ch);

    return $handles;
}
